/*******************************************************************************
 * Copyright (c) 2010, 2016 Ericsson and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Marc-Andre Laperle - Added test for the gdb version string converter
 *     Alvaro Sanchez-Leon (Ericsson) - Bug 437562 - Split the dsf-gdb tests to a plug-in and fragment pair
 *******************************************************************************/
package org.eclipse.cdt.dsf.gdb.tests;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.cdt.dsf.gdb.launching.LaunchUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class LaunchUtilsTest {
	
	private class Versions {
		private String version1;
		private String version2;
		private int expectedResult;
		
		public Versions(String v1, String v2, int result) {
			version1 = v1;
			version2 = v2;
			expectedResult = result;
		}
	}

    @Before
    public void init() {
    }

    @After
    public void shutdown() {
    }
	
    @Test
	public void testGDBVersionFromText() {
    	Map<String, String> versions = new HashMap<>(10);

    	versions.put("GNU gdb 6.8.50.20080730", "6.8.50.20080730");
    	versions.put("GNU gdb (GDB) 6.8.50.20080730-cvs", "6.8.50.20080730");
    	versions.put("GNU gdb (Ericsson GDB 1.0-10) 6.8.50.20080730-cvs", "6.8.50.20080730");
    	versions.put("GNU gdb (GDB) Fedora (7.0-3.fc12)", "7.0");
    	versions.put("GNU gdb 6.8.0.20080328-cvs (cygwin-special)", "6.8");  // Special for cygwin
    	versions.put("GNU gdb 7.0", "7.0");
    	versions.put("GNU gdb Fedora (6.8-27.el5)", "6.8");
    	versions.put("GNU gdb Red Hat Linux (6.3.0.0-1.162.el4rh)", "6.3.0.0");
    	versions.put("GNU gdb (GDB) STMicroelectronics/Linux Base 7.4-71 [build Mar  1 2013]", "7.4");

    	for (String key : versions.keySet()) {
    		assertEquals("From \"" + key + "\"", versions.get(key), LaunchUtils.getGDBVersionFromText(key));
    	}
    }
    
    /**
     * Verify that GDB version comparison is done properly.
     */
    @Test
    public void testGDBVersionComparison() {
    	List<Versions> versions = new ArrayList<>(100);

    	versions.add(new Versions("7",		"6",		 1));
    	versions.add(new Versions("7",		"6.1",		 1));
    	versions.add(new Versions("7",		"6.1.1",	 1));
    	versions.add(new Versions("7",		"7",		 0));
    	versions.add(new Versions("7",		"7.0",		 0));
    	versions.add(new Versions("7",		"7.0.0",	 0));
    	versions.add(new Versions("7",		"7.1",		-1));
    	versions.add(new Versions("7",		"7.1.1",	-1));
    	versions.add(new Versions("7",		"8",		-1));
    	versions.add(new Versions("7",		"8.0",		-1));
    	versions.add(new Versions("7",		"8.1",		-1));
    	versions.add(new Versions("7",		"8.1.1",	-1));
    	versions.add(new Versions("7",		"10",		-1));
    	versions.add(new Versions("7",		"10.0",		-1));
    	versions.add(new Versions("7",		"10.1",		-1));
    	versions.add(new Versions("7",		"10.1.1", 	-1));
    	versions.add(new Versions("7",		"70",	 	-1));
    	versions.add(new Versions("7",		"70.1",	 	-1));
    	versions.add(new Versions("7",		"70.1.1", 	-1));
    	versions.add(new Versions("7",		"72",	 	-1));
    	versions.add(new Versions("7",		"72.1",	 	-1));
    	versions.add(new Versions("7",		"72.1.1", 	-1));

    	versions.add(new Versions("7.3",	"6",	  	 1));
    	versions.add(new Versions("7.3",	"6.4",	  	 1));
    	versions.add(new Versions("7.3",	"6.4.4", 	 1));
    	versions.add(new Versions("7.3",	"7",	  	 1));
    	versions.add(new Versions("7.3",	"7.0",	  	 1));
    	versions.add(new Versions("7.3",	"7.3",	  	 0));
    	versions.add(new Versions("7.3",	"7.3.0", 	 0));
    	versions.add(new Versions("7.0",	"7.0",  	 0));
    	versions.add(new Versions("7.3",	"7.3.3",	-1));
    	versions.add(new Versions("7.3",	"7.30", 	-1));
    	versions.add(new Versions("7.3",	"7.30.3",	-1));
    	versions.add(new Versions("7.3",	"8",	 	-1));
    	versions.add(new Versions("7.3",	"8.0",	 	-1));
    	versions.add(new Versions("7.3",	"8.1",	 	-1));
    	versions.add(new Versions("7.3",	"8.1.1",	-1));
    	versions.add(new Versions("7.3",	"8.4",	 	-1));
    	versions.add(new Versions("7.3",	"8.4.4",	-1));
    	versions.add(new Versions("7.3",	"10",	 	-1));
    	versions.add(new Versions("7.3",	"10.0", 	-1));
    	versions.add(new Versions("7.3",	"10.1", 	-1));
    	versions.add(new Versions("7.3",	"10.1.1",	-1));
    	versions.add(new Versions("7.3",	"10.4", 	-1));
    	versions.add(new Versions("7.3",	"10.4.4",	-1));
    	versions.add(new Versions("7.3",	"70",	 	-1));
    	versions.add(new Versions("7.3",	"70.1", 	-1));
    	versions.add(new Versions("7.3",	"70.1.1",	-1));
    	versions.add(new Versions("7.3",	"72",	 	-1));
    	versions.add(new Versions("7.3",	"72.1", 	-1));
    	versions.add(new Versions("7.3",	"72.1.1",	-1));

    	versions.add(new Versions("7.5.4",	"6",	  	 1));
    	versions.add(new Versions("7.5.4",	"6.4",  	 1));
    	versions.add(new Versions("7.5.4",	"6.4.4", 	 1));
    	versions.add(new Versions("7.5.4",	"6.5",	 	 1));
    	versions.add(new Versions("7.5.4",	"6.5.4", 	 1));
    	versions.add(new Versions("7.5.4",	"7",	  	 1));
    	versions.add(new Versions("7.5.4",	"7.0",	  	 1));
    	versions.add(new Versions("7.5.4",	"7.3",	  	 1));
    	versions.add(new Versions("7.5.4",	"7.3.0", 	 1));
    	versions.add(new Versions("7.5.4",	"7.5",	 	 1));
    	versions.add(new Versions("7.5.4",	"7.5.3",	 1));
    	versions.add(new Versions("7.5.4",	"7.5.4",	 0));
    	versions.add(new Versions("7.0.0",	"7.0.0", 	 0));
    	versions.add(new Versions("7.5.4",	"7.7",	 	-1));
    	versions.add(new Versions("7.5.4",	"7.7.6",	-1));
    	versions.add(new Versions("7.5.4",	"7.50", 	-1));
    	versions.add(new Versions("7.5.4",	"7.50.3", 	-1));
    	versions.add(new Versions("7.5.4",	"7.50.4",	-1));
    	versions.add(new Versions("7.5.4",	"8",	 	-1));
    	versions.add(new Versions("7.5.4",	"8.0",	 	-1));
    	versions.add(new Versions("7.5.4",	"8.1",	 	-1));
    	versions.add(new Versions("7.5.4",	"8.1.1",	-1));
    	versions.add(new Versions("7.5.4",	"8.5",	 	-1));
    	versions.add(new Versions("7.5.4",	"8.5.4",	-1));
    	versions.add(new Versions("7.5.4",	"10",	 	-1));
    	versions.add(new Versions("7.5.4",	"10.0", 	-1));
    	versions.add(new Versions("7.5.4",	"10.1", 	-1));
    	versions.add(new Versions("7.5.4",	"10.1.1",	-1));
    	versions.add(new Versions("7.5.4",	"10.5", 	-1));
    	versions.add(new Versions("7.5.4",	"10.5.4",	-1));
    	versions.add(new Versions("7.5.4",	"10.7.4",	-1));
    	versions.add(new Versions("7.5.4",	"7.10",		-1));
    	versions.add(new Versions("7.5.4",	"7.10.1",	-1));
    	versions.add(new Versions("7.5.4",	"7.10.5",	-1));
    	versions.add(new Versions("7.5.4",	"72",		-1));
    	versions.add(new Versions("7.5.4",	"72.1",		-1));
    	versions.add(new Versions("7.5.4",	"72.1.1",	-1));
    	
    	versions.add(new Versions("6.8.51",	"6.8.50.20080730",	1));
    	versions.add(new Versions("6.9.4",	"6.8.50.20080730",	1));
    	versions.add(new Versions("6.8.50.20080730", "6.8.50.20080730",	0));
    	versions.add(new Versions("6.5.4",	"6.8.50.20080730",	-1));
    	versions.add(new Versions("6.8.50",	"6.8.50.20080730",	-1));

    	for (Versions v : versions) {
    		assertEquals("Comparing " + v.version1 + " and " + v.version2,
    				v.expectedResult,
    				LaunchUtils.compareVersions(v.version1, v.version2));
    		assertEquals("Comparing " + v.version2 + " and " + v.version1,
    				-v.expectedResult,
    				LaunchUtils.compareVersions(v.version2, v.version1));
    	}
    }
}
